package com.example.lucky.draw.server.job.scheduler;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling //用于启动基于注解的定时任务，Spring的任务调度器就会被激活
public class ActivityScheduler {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job activityExpirationJob;

    @Autowired
    private JobExplorer jobExplorer;

    /**
     * 0 0/1 * * * ?
     * 第一个字段 表示秒，取值范围 0-59，这里表示0，在0秒开始
     * 第二个字段 表示分，取值范围 0-59，这里表示0，从0分开始，0/1表示每分钟执行一次
     * 第三个字段 表示时，取值范围 0-23，*表示任意小时
     * 第四个字段 表示日，取值范围 1-31，*表示任意日期
     * 第五个字段 表示月，取值范围 1-12，*表示任意月份
     * 第六个字段 表示星期 ，取值范围 1-7 ，1-7分别表示星期一到星期日，？表示不指定星期
     *
     * 新的需求：每天的20点30开始执行，每隔7分钟执行一次，到22点结束
     *
     * 0 30/7 20-22 * * ?
     *
     * 参考：https://cron.ciding.cc/
     */
    @Scheduled(cron = "0 0/1 * * * ?")//每分钟执行一次
    public void runJob() throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
        JobParameters jobParameters = new JobParametersBuilder(new JobParameters(), jobExplorer)
                .getNextJobParameters(activityExpirationJob)
                .toJobParameters();
        jobLauncher.run(activityExpirationJob, jobParameters);
    }
}
